/*
 * pointer.c
 *
 *  Created on: 2019年5月7日
 *      Author: Administrator
 */

#include <stdio.h>
#include <stdlib.h>
#include "../include/pointer.h"
#define LENGTH 10
/**
 * 指针
 * 指针是一个变量（指针型变量），其值为另一个变量的地址。地址是长十六进制数
 * 分类：基本指针、函数指针
 *
 * 基本指针指向整型、字符型等基本数据类型
 *
 * 函数指针
 * 函数指针是指向函数的指针变量。
 * 函数指针可以像一般函数一样，用于调用函数、传递参数
 *
 * 回调函数
 * 函数指针作为某个函数的参数，该函数叫回调函数
 */

void pointer(void) {

	int data = 1;
	float arr[10];

	printf("data 变量的地址：%p \n", &data);
	printf("arr 数组的地址：%p \n", &arr);

	// 声明一个指针
	int *ip = NULL;

	printf("ip 指针赋值前：%p \n", ip);

	ip = &data; // 指针ip指向data

	printf("ip 指针指向data地址：%p \n", ip);
	printf("ip 指向data的值：%d \n", *ip);

}

int max(int x, int y) {
	return x > y ? x : y;
}

void func_pointer() {

	// 声明函数指针
	int (* fptr)(int, int) = &max;
	int a = 10, b = a + 1, c = b + 1;

	// 与直接调用函数max(max(a,b),c)等价
	int max_result = fptr(fptr(a, b), c);

	printf("最大的数字是：%d \n", max_result);

	// 生成10个数字
	int array[LENGTH];

	for (int i=0; i<LENGTH; i++) {
		array[i] = rand();
		printf("%d \t", array[i]);
	}

	int arr_max = calculate_max(array, &max);

	printf("数组最大值为：%d", arr_max);
}

// 回调函数
int calculate_max(int array[], int (* fptr)(int, int)) {

	// 获取array数组，通过回调函数fptr来求出数组中最大的数字
	int max = 0;
	for (int i=0; i<LENGTH;i++) {
		max = fptr(max, array[i]);
	}
	return max;
}

